/***********************************************************************************************//**
*\n  @file       bus_spi.cpp
*\n  @brief      spi 总线
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n 	1. spi 总线 (控制spi转uart芯片sc16is752)
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:  	 修改人:       修改日期:        描述:
*\n  V0.01   罗先能        2021.05.10    创建
*\n
***************************************************************************************************/


/**************************************************************************************************
* 头文件
***************************************************************************************************/
#include <iostream>
#include "bus_spi.hpp"

#undef  DEBUG_LEVEL
#define DEBUG_LEVEL  2   // 定义debug级别 (0 ~ 5)
#include "vdebug.h"

using namespace std;

/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/


/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有函数声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/
TSpiBus::TSpiBus(const char *name, const char *pDevicePath)
{
	// 1. 保存名称
	memset(this->mName, 0, sizeof(this->mName));
	int iSize = sizeof(this->mName) - 1;
	iSize = iSize < strlen(name)  ? iSize : strlen(name);
	memcpy(this->mName, name, iSize);

	this->mFd = open(pDevicePath, O_RDWR);
	if (this->mFd  < 0)
	{
		debug_error("Open(%s) < 0 \n", pDevicePath);
		return ;
	}

	debug_printf("%s->TSpiBus(%s) OK\n",this->mName, pDevicePath);
}

TSpiBus::~TSpiBus()
{
	if (this->mFd > 0)
	{
		close(this->mFd);
		this->mFd = -1;
	}
	debug_printf("%s->~TSpiBus() OK\n",this->mName);
}



/*************************************************************************************//**
*\n 函数名称： TSpiBus.Ioctl()
*\n 功能描述：
*\n     (1) // 读取RX Fifo中接收到的数据长度:
*\n         u32 length;  // byte[0]/[1]:依次对应通道0/通道1中RX fifo数据长度
*\n         ret = Ioctl(GET_RECV_LENGTH, &length);
*\n     (2) // 设置波特率
*\n			int iBandrate = 115200;
*\n     	ret = pBus->Ioctl(SET_BPS, (void*)iBandrate);
*\n     (3) // 设置停止位
*\n			int iStopBit = 1;
*\n     	ret = Ioctl(SET_STOP_BIT, (void*)iStopBit);
*\n     (4)// 设置奇偶校验位
*\n			int iParity = 1; //0=null,1=odd, 2=even
*\n     	ret = Ioctl(SET_PARITY, (void*)iParity);
*\n
*\n 输入参数：
*\n            long cmd
*\n            void *pBuf
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n    错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.5.14     创建
*****************************************************************************************/
int TSpiBus::Ioctl(long cmd, void *pBuf)
{
	// if (this->mFd > 0)
	// {
	// 	debug_error("mFd < 0 \n");
	// 	return -1;
	// }

	int iRet = ioctl(mFd, cmd, pBuf);
	return iRet;
}


int TSpiBus::Write(long address, void *pBuf, long iCnt)
{
	// if ((mFd < 0) || (NULL == pBuf) || (iCnt <= 0))
	// {
	// 	if (mFd < 0)
	// 		debug_error("mFd < 0 \n");
	// 	if (NULL == pBuf)
	// 		debug_error("NULL == pBuf \n");
	// 	if (iCnt <= 0)
	// 		debug_error("iCnt <= 0 \n");
	// 	return -1;
	// }

	int ret = write(mFd, pBuf, iCnt);
	if(ret < 0)
	{
		debug_error("write() < 0\n");
	}
	return ret;
}


int TSpiBus::Read(long address, void *pBuf, long iCnt)
{
	// if ((mFd < 0) || (NULL == pBuf) || (iCnt <= 0))
	// {
	// 	if (mFd < 0)
	// 		debug_error("mFd < 0 \n");
	// 	if (NULL == pBuf)
	// 		debug_error("NULL == pBuf \n");
	// 	if (iCnt <= 0)
	// 		debug_error("iCnt <= 0 \n");
	// 	return -1;
	// }

	int ret = read(mFd, pBuf, iCnt);
	return ret;
}



